/**
 * 
 */
package ch.baeni.jee.web;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import ch.baeni.jee.data.UserRepository;
import ch.baeni.jee.model.User;
import ch.baeni.jee.service.UserService;

/**
 * ManagedBean fuer User
 * 
 * @author Benjamin
 * 
 */
@ManagedBean
@ViewScoped
public class UserBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private User user;

	@Inject
	private UserRepository userRep;

	@Inject
	private UserService userService;

	private String pwConfirm;

	/**
	 * Init-Methode fuer UserBean
	 */
	@PostConstruct
	public void init() {
		String username = (String) FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap().get("username");
		if (username != null && !username.isEmpty()) {
			user = userRep.findUserByUsername(username);
			pwConfirm = user.getPassword();
		}
		if (user == null) {
			user = new User();
		}
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	/**
	 * Gibt eine Liste aller Benutzer der Applikation.
	 * 
	 * @return List<User>
	 */
	public List<User> getUsers() {
		return userRep.findAllOrderedByName();
	}

	/**
	 * Aktiviert den ausgewählten Benutzer wenn er inaktiv ist und<br>
	 * deaktiviert den ausgewählten Benutzer, wenn er aktiv ist<br>
	 * 
	 */
	public void deActivateUser(User user) {
		// Verhindern, dass Admin sich selber deaktiviert
		if (user.getId().compareTo(
				getSessionLoginBean().getCurrentUser().getId()) == 0) {
			return;
		}
		if (user.isActive()) {
			user.setActive(0);
		} else {
			user.setActive(1);
		}
		userService.saveUser(user);
	}

	/**
	 * Löscht den ausgewählten Benutzer aus der Datenbank.<br>
	 * 
	 */
	public void deleteUser(User user) {
		if (!user.isAdmin()) { // Can only delete user if selected user is not
								// admin
			userService.deleteUser(user);
		}
	}

	/**
	 * Speichert/Aktualisiert einen Benutzer in der Datenbank.
	 * 
	 * @return String für die Navigation.
	 */
	public String saveUser(User user) {

		userService.saveUser(user);

		if (getSessionLoginBean().getCurrentUser().isAdmin()) {
			return "userlist";
		} else {
			return "links";
		}
	}

	/**
	 * Gibt aktuelles Session-LoginBean zurück
	 * 
	 * @return LoginBean Aktuelles Session-LoginMBean
	 */
	private LoginBean getSessionLoginBean() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		return (LoginBean) session.getAttribute("loginBean");
	}

	public String getPwConfirm() {
		return pwConfirm;
	}

	public void setPwConfirm(String pwConfirm) {
		this.pwConfirm = pwConfirm;
	}
}
